package com.zbiti.anvil.webservice.gateway.samples;

import com.zbiti.anvil.webservice.gateway.samples.domain.DemoParamDomain;
import com.zbiti.sdk.common.annotation.validation.Composite;
import com.zbiti.sdk.common.annotation.validation.IgnoreValidate;
import com.zbiti.sdk.common.annotation.validation.Max;
import com.zbiti.sdk.common.annotation.validation.Min;
import com.zbiti.sdk.common.annotation.validation.NotEmpty;
import com.zbiti.sdk.common.annotation.validation.NotNull;
import com.zbiti.sdk.common.annotation.validation.Pattern;
import com.zbiti.sdk.common.annotation.webservice.Endpoint;

import jakarta.jws.WebParam;
import jakarta.jws.WebService;
import java.util.List;
import java.util.Map;

/**
 * 示例Web服务接口
 *
 * <pre>
 *     1.WebService的开发方法与原来相同，使用@WebService注解即可
 *     2.Anvil平台提供@Endpoint注解可以自动发布成服务，由平台统一托管，包括后续的所有平台提供的功能均基于此标签
 *          2.1 value参数指定发布的地址
 *     3.当Endpoint中validate为true时，平台自动对使用@NotNull、@NotEmpty、@Pattern、@Min、@Max注解的输入参数进行校验
 *     4.@IgnoreValidate注解可以忽略对某个方法的参数校验
 * </pre>
 * @author Fanyc
 * @date 2022-01-11 13:57
 */
@WebService
@Endpoint(value = "/demo",validate = true)
public interface DemoWebService {

    /**
     * 演示服务接口1
     *
     * @return 输出参数
     */
    String execute1(@WebParam(name = "p1") @NotNull @NotEmpty String param1
            , @WebParam(name = "p2") @NotNull @NotEmpty List<Integer> param2
            , @WebParam(name = "p3") @NotNull @NotEmpty Map<String, Long> param3
            , @WebParam(name = "p4") @Pattern("[0-9|a-z|A-Z]{3,5}") String param4);

    /**
     * 演示服务接口2
     *
     * @return 输出参数
     */
    String execute2(@WebParam(name = "p1") @Min("3") @Max("5") String param1
            , @WebParam(name = "p2") @Min("3") @Max("5") List<Integer> param2
            , @WebParam(name = "p3") @Min("3") @Max("5") Map<String, Object> param3
            , @WebParam(name = "p4") @Min("3") @Max("5") Float param4);

    /**
     * 演示服务接口3
     */
    String execute3(@Composite DemoParamDomain domain);

    /**
     * 演示服务接口4
     */
    String execute4(@NotNull @NotEmpty @Min("2") @Max("3")  @Composite List<DemoParamDomain> domain);

    /**
     * 演示服务接口5:不校验
     */
    @IgnoreValidate
    String execute5(@NotNull @NotEmpty @Min("2") @Max("3") String param);

    /**
     * 演示服务接口6:不校验
     */
    @IgnoreValidate
    String execute6(@NotNull @NotEmpty @Composite DemoParamDomain domain);

}
